#include "08-RAII-lock.h"

/*
 * 做一个简单设计，传入一个锁自动帮我们加锁和解锁，RAII风格加锁
 */

using std::cout;
using std::endl;
int tickets = 1000;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *get_ticket(void *args)
{
    std::string username = static_cast<const char *>(args);
    while (true)
    {
        {//代码块，不给usleep加锁
            LockGuard lockguard(&lock);
            if (tickets > 0)
            {
                usleep(1111);
                cout << username << "正在抢票 : " << tickets << endl;
                tickets--;
            }
            else
            {
                break;
            }
        }
        usleep(1000);
    }
    return nullptr;
}

int main()
{
    pthread_t t1, t2, t3, t4;
    pthread_create(&t1, nullptr, get_ticket, (void *)"thread 1");
    pthread_create(&t2, nullptr, get_ticket, (void *)"thread 2");
    pthread_create(&t3, nullptr, get_ticket, (void *)"thread 3");
    pthread_create(&t4, nullptr, get_ticket, (void *)"thread 4");

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
    pthread_join(t4, nullptr);
    pthread_join(t4, nullptr);
    return 0;
}

#if 0
thread 3正在抢票 : 24
thread 2正在抢票 : 23
thread 3正在抢票 : 22
thread 4正在抢票 : 21
thread 1正在抢票 : 20
thread 2正在抢票 : 19
thread 3正在抢票 : 18
thread 4正在抢票 : 17
thread 1正在抢票 : 16
thread 2正在抢票 : 15
thread 3正在抢票 : 14
thread 4正在抢票 : 13
thread 3正在抢票 : 12
thread 2正在抢票 : 11
thread 1正在抢票 : 10
thread 4正在抢票 : 9
thread 3正在抢票 : 8
thread 4正在抢票 : 7
thread 3正在抢票 : 6
thread 2正在抢票 : 5
thread 1正在抢票 : 4
thread 4正在抢票 : 3
thread 3正在抢票 : 2
thread 2正在抢票 : 1
#endif
